package com.feicheng.service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.feicheng.common.result.ResultInfo;
import com.feicheng.persistence.entity.CardType;
import com.feicheng.persistence.entity.Client;
import com.feicheng.persistence.entity.VoucherRecord;
import com.feicheng.persistence.entity.VoucherType;
import com.feicheng.persistence.model.DepositRecordMain;
import com.feicheng.persistence.model.VipMain;

import java.io.IOException;
import java.util.Set;

public interface IFClientService {

    ResultInfo rejectDeposit(Integer backId, String reason);

    ResultInfo backDeposit(Integer backId);

    /**
     * 根据clientId查询所有vipID
     * @param clientId
     * @return
     */
    JSONArray getVipIDsByClientId(Integer clientId);

    /**
     * 分页查询客户信息
     * @param param 客户名称 电话 会员状态 性别 年龄区间 门店 当前页 每页条数
     * @autor 徐航
     * @return
     */
    ResultInfo getClientsByPage(JSONObject param);

    /**
     * 删除客户
     * @param clientId 主键：客户编号
     * @autor 徐航
     * @return
     */
    ResultInfo deleteClient(Integer clientId);

    /**
     * 更新客户信息
     * @param client 客户信息
     * @autor 徐航
     * @return
     */
    ResultInfo updateClient(Client client);

    /**
     * 取得客户详细信息
     * @param clientId 主键：客户编号
     * @autor 徐航
     * @return 客户基本信息  客户账户信息 客户订单信息 客户押金信息 客户会员信息
     */
    ResultInfo getClient(Integer clientId);

    /**
     * 分页查询会员信息
     * @autor 李志
     * @return
     */
    ResultInfo getVipsByPage(VipMain vipMain, Integer current, Integer size);

    /**
     * 取得会员详细信息
     * @param vipId 主键：会员编号
     * @autor 李志
     * @return 会员基本信息 会员卡信息
     */
    ResultInfo getVip(Integer vipId);

    /**
     * 删除会员信息
     * @param vipId 主键：会员编号
     * @autor 李志
     * @return
     */
    ResultInfo deleteVip(Integer vipId);

    /**
     * 更新会员信息
     * @param param
     * @autor 李志
     * @return
     */
    ResultInfo updateVip(JSONObject param);

    /**
     * 新增会员信息
     *  包含券记录/卡记录 支付记录 更新客户账户时长
     * @param param
     * @autor 李志
     * @return
     */
    ResultInfo newVip(JSONObject param);

    /**
     * 分页查询会员卡类型
     * @param cardType 当前页 每页条数
     * @autor 杜飞
     * @return
     */
    ResultInfo getCardTypesByPage(CardType cardType, Integer current, Integer size);

    /**
     * 更新会员卡类型信息
     * @param cardType 会员卡类型基本信息
     * @param price 价格信息
     * @autor 杜飞
     * @return
     */
    ResultInfo updateCardType(CardType cardType, Integer price);

    /**
     * 新增会员卡类型信息
     * @param cardType 会员卡类型基本信息
     * @param price 价格信息
     * @autor 杜飞
     * @return 
     */
    ResultInfo newCardType(CardType cardType, Integer price);

    /**
     * 删除会员卡类型信息
     * @param cardTypeId 主键：会员卡类型编号
     * @autor 杜飞
     * @return
     */
    ResultInfo deleteCardType(Integer cardTypeId);

    /**
     * 取得所有会员卡类型信息
     * @param cardType
     * @autor 杜飞
     * @return 会员卡类型基本信息  价格信息
     */
    ResultInfo getCardTypes(CardType cardType);

    /**
     * 通过id取得会员卡详情
     * @param cardTypeId
     * @autor 杜飞
     * @return 会员卡类型基本信息
     */
    ResultInfo getCardTypeById(Integer cardTypeId);

    /**
     * 分页查询会员券类型信息
     * @param param
     * @autor 杜飞
     * @return
     */
    ResultInfo getVoucherTypesByPage(JSONObject param);

    /**
     * 更新会员券类型信息
     * @param voucherType
     * @autor 杜飞
     * @return
     */
    ResultInfo updateVoucherType(VoucherType voucherType);

    /**
     * 新增会员券类型信息
     * @param voucherType
     * @autor 杜飞
     * @return
     */
    ResultInfo newVoucherType(VoucherType voucherType);

    /**
     * 删除会员券类型信息
     * @param voucherTypeId 主键：会员券编号
     * @autor 杜飞
     * @return
     */
    ResultInfo deleteVoucherType(Integer voucherTypeId);

    /**
     * 通过id取得会员券信息
     * @param voucherTypeId
     * @return
     */
    ResultInfo getVoucherTypeById(Integer voucherTypeId);

    /**
     * 取得所有会员券类型
     * @param voucherType
     * @autor 杜飞
     * @return
     */
    ResultInfo getVouchers(VoucherType voucherType);

    /**
     * 分页查询会员券信息
     * @param param
     * @autor 杜飞
     * @return
     */
    ResultInfo getVouchersByPage(JSONObject param);

    /**
     * 取得会员券信息
     * @param voucherId 主键：会员券编号
     * @autor 杜飞
     * @return
     */
    ResultInfo getVoucher(Integer voucherId);

    /**
     * 修改会员券信息
     * @param voucherRecord
     * @autor 杜飞
     * @return
     */
    ResultInfo updateVoucher(VoucherRecord voucherRecord);

    /**
     * 校验并取得会员券信息
     * @param uuId
     * @param password
     * @autor 杜飞
     * @return 会员券信息
     */
    ResultInfo checkVoucher(String uuId, String password,Integer clientId);

    /**
     * 批量导出会员券信息
     * @param voucherIds
     * @autor 杜飞
     * @return
     */
    ResultInfo exportVoucher(Set<Integer> voucherIds) throws IOException;

    /**
     * 批量生成会员券信息
     * @param voucherTypeId 会员券类型
     * @param count 数量
     * @autor 杜飞
     * @return
     */
    ResultInfo newVouchers(Integer voucherTypeId, Integer count,Boolean statu);

    /**
     * 取得二维码接口
     * @param clientId
     * @autor 房存旭
     * @return
     */
    ResultInfo getQcode(Integer clientId, Integer storeId);

    /**
     * 校验二维码
     * @param param
     * @return
     */
    String CheckCode(JSONObject param);

    /**
     * 分页查询押金记录
     * @param param 支付平台支付编号 客户名 创建时间 门店id 押金类型 当前页 每页条数
     * @autor 刘坤
     * @return
     */
    ResultInfo getDepositRecordByPage(DepositRecordMain depositRecordMain, Integer current, Integer size);

    /**
     * 取得押金记录
     * @autor 刘坤
     * @param depositId 主键：押金记录编号
     * @return
     */
    ResultInfo getDepositRecord(Integer depositId);

    /**
     * 新增押金记录
     * @autor 刘坤
     *  包含支付平台支付编号，交易金额，押金类型，原因
     * @param param
     * @return
     */
    ResultInfo newDepositRecord(JSONObject param);

    /**
     * 分页查询退押申请
     * @autor 刘坤
     * @param param 退押申请编号 客户名 创建时间 门店id 操作时间 申请状态 当前页 每页条数
     * @return
     */
    ResultInfo getDepositBackRequestByPage(JSONObject param);
    
    ResultInfo getDepositBackRequestAll(JSONObject param);

    /**
     * 取得退押申请记录
     * @autor 刘坤
     * @param backId 主键：退押申请编号
     * @return
     */
    ResultInfo getDepositBackRequest(Integer backId);

    /**
     * 新增退押申请
     * @autor 刘坤
     *  包含金额，申请状态，clientId，
     * @param param
     * @return
     */
    ResultInfo newDepositBackRequest(JSONObject param);

    /**
     * 更新退押申请
     * @autor 刘坤
     *  包含原因，金额，申请状态，押金记录编号，uu
     * @param param
     * @return
     */
    ResultInfo updateDepositBackRequest(JSONObject param);

    /**
     * 分页查询扣押记录
     * @autor 刘坤
     * @param param 扣押记录编号 客户名 创建时间 门店id 扣押状态 当前页 每页条数
     * @return
     */
    ResultInfo getCutDepositRecordByPage(JSONObject param);

    /**
     * 取得扣押记录
     * @autor 刘坤
     * @param cutId 主键：扣押记录编号
     * @return
     */
    ResultInfo getCutDepositRecord(Integer cutId);

    /**
     * 新增扣押记录
     * @autor 刘坤
     *  包含金额，原因，clientId，扣押状态
     * @param param
     * @return
     */
    ResultInfo newCutDepositRecord(JSONObject param);

    /**
     * 更新扣押记录
     * @autor 刘坤
     *  包含原因，金额，扣押状态
     * @param param
     * @return
     */
    ResultInfo updateCutDepositRecord(JSONObject param);
    /**
     * @autor 李志
     * 查询价格表信息
     * @param
     * @return
     */
    ResultInfo getPrice();

    /**
     * @autor 李志
     * 包含修改价格表信息
     * @param
     * @return
     */
    ResultInfo updatePrice(Integer amount);

    ResultInfo cutDeposit(Integer amount, String reason, Integer clientId);

    ResultInfo cancelCutDeposit(Integer cutId);

    ResultInfo getDeposit();
    ResultInfo updateDeposit(Integer amount);

    /**
     * @autor H
     * 查询账单押金大于0
     * @param
     * @return
     */
    ResultInfo getAccount(Integer clientId);

}
